package com.witmore.neutron.ai.mcp.server.trading;

import com.alibaba.fastjson2.JSON;
import com.witmore.neutron.ai.mcp.server.trading.dto.AlertConfigDTO;
import com.witmore.neutron.ai.mcp.server.trading.service.AlertConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 异动预警配置MCP服务
 *
 * @author 豆子高
 * @since 2025-01-06
 */
@Slf4j
@Service
public class AlertConfigMcpServer {

    @Autowired
    private AlertConfigService alertConfigService;

    @Tool(description = "创建股票异动预警配置（支持单个和批量）")
    public String createStockAlert(
            @ToolParam(description = "股票代码，多个用逗号隔开，例如：000001,000002", required = false) String stockCodes,
            @ToolParam(description = "预警上涨比例（百分比），例如：5.0表示上涨5%时预警", required = false) BigDecimal riseRatio,
            @ToolParam(description = "预警下跌比例（百分比），例如：3.0表示下跌3%时预警", required = false) BigDecimal fallRatio,
            @ToolParam(description = "异动预警消息推送频率，单位：分钟，例如：30表示30分钟推送一次", required = false) Integer pushFrequency,
            @ToolParam(description = "$_yumo_agent_user_phone_$") String phone) {

        try {
            log.info("接收到异动预警创建请求 - 股票代码：{}，上涨比例：{}%，下跌比例：{}%，推送频率：{}分钟，手机号：{}",
                    stockCodes, riseRatio, fallRatio, pushFrequency, phone);

            if (!StringUtils.hasText(phone)) {
                throw new RuntimeException("手机号不能为空");
            }
            // 参数校验 辅助LLM实现多轮槽位补全能力
            if (!StringUtils.hasText(stockCodes)) {
                return "股票代码不能为空";
            }
            if (riseRatio == null || riseRatio.compareTo(BigDecimal.ZERO) <= 0) {
                return "上涨比例必须大于0";
            }
            if (fallRatio == null || fallRatio.compareTo(BigDecimal.ZERO) <= 0) {
                return "下跌比例必须大于0";
            }
            if (pushFrequency == null || pushFrequency <= 0) {
                return "推送频率必须大于0分钟";
            }

            // 构建配置DTO
            AlertConfigDTO alertConfigDTO = new AlertConfigDTO();
            alertConfigDTO.setPhone(phone);
            alertConfigDTO.setStockCodes(stockCodes.trim());
            alertConfigDTO.setRiseRatio(riseRatio);
            alertConfigDTO.setFallRatio(fallRatio);
            alertConfigDTO.setPushFrequency(pushFrequency);
            alertConfigDTO.setAlertEnabled(1);

            // 保存配置
            String result = alertConfigService.saveOrUpdateAlertConfig(alertConfigDTO);

            log.info("异动预警创建成功 - 配置详情：{}", JSON.toJSONString(alertConfigDTO));

            return String.format("""
                            ✅ %s
                            
                            📊 预警配置详情：
                            • 监控股票：%s
                            • 上涨预警：%s%%
                            • 下跌预警：%s%%
                            • 推送频率：每%d分钟
                            • 绑定手机：%s""",
                    result,
                    alertConfigDTO.getStockCodes(),
                    alertConfigDTO.getRiseRatio(),
                    alertConfigDTO.getFallRatio(),
                    alertConfigDTO.getPushFrequency(),
                    phone);

        } catch (Exception e) {
            log.error("创建异动预警配置失败", e);
            return "创建异动预警配置失败：" + e.getMessage();
        }
    }


    @Tool(description = "修改现有的股票异动预警配置，只需要传入要修改的参数，其他参数保持不变")
    public String updateStockAlert(
            @ToolParam(description = "要修改的股票代码，多个用英文逗号隔开，例如：000001,000002", required = false) String stockCodes,
            @ToolParam(description = "要修改的上涨预警比例（百分比），例如：5.0表示上涨5%时预警", required = false) BigDecimal riseRatio,
            @ToolParam(description = "要修改的下跌预警比例（百分比），例如：3.0表示下跌3%时预警", required = false) BigDecimal fallRatio,
            @ToolParam(description = "要修改的推送频率，单位：分钟，例如：30表示30分钟推送一次", required = false) Integer pushFrequency,
            @ToolParam(description = "$_yumo_agent_user_phone_$") String phone) {

        try {
            log.info("接收到异动预警修改请求 - 股票代码：{}，上涨比例：{}%，下跌比例：{}%，推送频率：{}分钟，手机号：{}",
                    stockCodes, riseRatio, fallRatio, pushFrequency, phone);

            if (!StringUtils.hasText(phone)) {
                return "用户手机号不能为空";
            }
            // 获取现有配置
            AlertConfigDTO existingConfig = alertConfigService.getUserAlertConfig(phone);

            if (existingConfig == null || !StringUtils.hasText(existingConfig.getStockCodes())) {
                return "未找到现有配置，请先使用 createStockAlert 创建预警配置";
            }

            // 检查是否有参数需要修改
            if (!StringUtils.hasText(stockCodes) && riseRatio == null && fallRatio == null && pushFrequency == null) {
                return "请至少提供一个要修改的参数";
            }

            // 构建更新后的配置DTO，基于现有配置
            AlertConfigDTO updatedConfig = new AlertConfigDTO();
            updatedConfig.setPhone(phone);

            // 股票代码：如果传了新值就用新值，否则用原有值
            if (StringUtils.hasText(stockCodes)) {
                updatedConfig.setStockCodes(stockCodes.trim());
            } else {
                updatedConfig.setStockCodes(existingConfig.getStockCodes());
            }

            // 上涨比例：如果传了新值且有效就用新值，否则用原有值
            if (riseRatio != null && riseRatio.compareTo(BigDecimal.ZERO) > 0) {
                updatedConfig.setRiseRatio(riseRatio);
            } else {
                updatedConfig.setRiseRatio(existingConfig.getRiseRatio());
            }

            // 下跌比例：如果传了新值且有效就用新值，否则用原有值
            if (fallRatio != null && fallRatio.compareTo(BigDecimal.ZERO) > 0) {
                updatedConfig.setFallRatio(fallRatio);
            } else {
                updatedConfig.setFallRatio(existingConfig.getFallRatio());
            }

            // 推送频率：如果传了新值且有效就用新值，否则用原有值
            if (pushFrequency != null && pushFrequency > 0) {
                updatedConfig.setPushFrequency(pushFrequency);
            } else {
                updatedConfig.setPushFrequency(existingConfig.getPushFrequency());
            }

            // 参数校验（验证无效参数）
            if (riseRatio != null && riseRatio.compareTo(BigDecimal.ZERO) <= 0) {
                return "上涨比例必须大于0";
            }
            if (fallRatio != null && fallRatio.compareTo(BigDecimal.ZERO) <= 0) {
                return "下跌比例必须大于0";
            }
            if (pushFrequency != null && pushFrequency <= 0) {
                return "推送频率必须大于0分钟";
            }

            // 保存更新后的配置
            alertConfigService.saveOrUpdateAlertConfig(updatedConfig);

            log.info("异动预警配置修改成功 - 配置详情：{}", JSON.toJSONString(updatedConfig));

            // 构建变更说明
            StringBuilder changeInfo = new StringBuilder("🔄 配置已更新\n\n");

            // 比较变更
            if (StringUtils.hasText(stockCodes) && !stockCodes.trim().equals(existingConfig.getStockCodes())) {
                changeInfo.append("• 股票代码：").append(existingConfig.getStockCodes()).append(" → ").append(updatedConfig.getStockCodes()).append("\n");
            }
            if (riseRatio != null && !riseRatio.equals(existingConfig.getRiseRatio())) {
                changeInfo.append("• 上涨预警：").append(existingConfig.getRiseRatio()).append("% → ").append(updatedConfig.getRiseRatio()).append("%\n");
            }
            if (fallRatio != null && !fallRatio.equals(existingConfig.getFallRatio())) {
                changeInfo.append("• 下跌预警：").append(existingConfig.getFallRatio()).append("% → ").append(updatedConfig.getFallRatio()).append("%\n");
            }
            if (pushFrequency != null && !pushFrequency.equals(existingConfig.getPushFrequency())) {
                changeInfo.append("• 推送频率：每").append(existingConfig.getPushFrequency()).append("分钟 → 每").append(updatedConfig.getPushFrequency()).append("分钟\n");
            }

            if (changeInfo.length() == 8) { //
                changeInfo.append("• 配置无变化\n");
            }

            return String.format("""
                            %s📊 当前配置详情：
                            • 监控股票：%s
                            • 上涨预警：%s%%
                            • 下跌预警：%s%%
                            • 推送频率：每%d分钟
                            • 绑定手机：%s""",
                    changeInfo,
                    updatedConfig.getStockCodes(),
                    updatedConfig.getRiseRatio(),
                    updatedConfig.getFallRatio(),
                    updatedConfig.getPushFrequency(),
                    phone);

        } catch (Exception e) {
            log.error("修改异动预警配置失败", e);
            return "❌ 修改异动预警配置失败：" + e.getMessage();
        }
    }


    @Tool(description = "查询用户预警配置信息，支持根据股票代码进行筛选查询")
    public String getStockAlertConfig(
            @ToolParam(description = "$_yumo_agent_user_phone_$") String phone,
            @ToolParam(description = "股票代码，多个用逗号隔开，例如：000001,000002，不传则查询所有股票配置", required = false) String stockCodes) {

        try {
            log.info("查询异动预警配置 - 手机号：{}，股票代码：{}", phone, stockCodes);

            if (!StringUtils.hasText(phone)) {
                return "用户手机号不能为空";
            }
            List<AlertConfigDTO> configs;

            if (StringUtils.hasText(stockCodes)) {
                // 如果指定了股票代码，按股票代码查询
                configs = alertConfigService.getStockAlertConfigsByStockCodes(phone, stockCodes);
            } else {
                // 如果没有指定股票代码，查询所有配置
                configs = alertConfigService.getAllUserStockAlertConfigs(phone);
            }

            if (configs == null || configs.isEmpty()) {
                String searchScope = StringUtils.hasText(stockCodes) ?
                        String.format("股票代码 %s 的", stockCodes) : "";
                return String.format("❌ 未找到%s异动预警配置，请先进行配置", searchScope);
            }

            StringBuilder result = new StringBuilder();

            if (StringUtils.hasText(stockCodes)) {
                result.append("📊 指定股票异动预警配置：\n\n");
            } else {
                result.append("📊 股票异动预警配置汇总：\n\n");
            }

            // 构建股票代码列表
            String allStockCodes = configs.stream()
                    .map(AlertConfigDTO::getStockCode)
                    .collect(Collectors.joining(","));

            result.append(String.format("• 监控股票：%s\n", allStockCodes));
            result.append(String.format("• 配置数量：%d 支股票\n", configs.size()));
            result.append(String.format("• 绑定手机：%s\n\n", phone));

            result.append("📋 详细配置信息：\n");
            for (int i = 0; i < configs.size(); i++) {
                AlertConfigDTO config = configs.get(i);
                result.append(String.format("%d. %s（%s）: 上涨%s%% / 下跌%s%% / 每%d分钟\n",
                        i + 1,
                        config.getStockCode(),
                        config.getStockName(),
                        config.getRiseRatio(),
                        config.getFallRatio(),
                        config.getPushFrequency()));
            }

            return result.toString();

        } catch (Exception e) {
            log.error("查询异动预警配置失败", e);
            return "查询异动预警配置失败：" + e.getMessage();
        }
    }


    @Tool(description = "开启或关闭（包含删除或取消指令）股票预警推送功能，可以控制是否接收预警定时任务的推送消息")
    public String toggleAlertPush(
            @ToolParam(description = "要设置的股票代码，多个用逗号隔开，例如：000001,000002。不传则设置全部股票", required = false) String stockCodes,
            @ToolParam(description = "是否开启预警推送：true-开启，false-关闭") Boolean enabled,
            @ToolParam(description = "$_yumo_agent_user_phone_$") String phone) {

        try {
            log.info("接收到预警推送状态设置请求 - 股票代码：{}，开启状态：{}，手机号：{}",
                    stockCodes, enabled, phone);

            if (!StringUtils.hasText(phone)) {
                return "用户手机号不能为空";
            }
            // 参数校验
            if (enabled == null) {
                return "请指定是否开启预警推送（true-开启，false-关闭）";
            }

            // 调用服务层方法
            String result = alertConfigService.updateAlertPushStatus(phone, stockCodes, enabled);

            String statusText = enabled ? "开启" : "关闭";
            String targetText = !StringUtils.hasText(stockCodes) ? "全部股票" : stockCodes;
            log.info("预警推送状态设置成功 - 目标：{}，状态：{}", targetText, statusText);

            return String.format("""
                            ✅ %s
                            
                            📲 推送设置详情：
                            • 设置范围：%s
                            • 推送状态：%s
                            • 绑定手机：%s
                            
                            💡 提示：%s状态下，您将%s收到相关股票的异动预警推送消息""",
                    result,
                    !StringUtils.hasText(stockCodes) ? "全部股票" : stockCodes,
                    enabled ? "✅ 已开启" : "❌ 已关闭",
                    phone,
                    statusText,
                    enabled ? "会" : "不会");

        } catch (Exception e) {
            log.error("设置预警推送状态失败", e);
            return "❌ 设置预警推送状态失败：" + e.getMessage();
        }
    }

    @Tool(description = "查询股票预警推送状态，查看哪些股票的推送功能是开启还是关闭的")
    public String getAlertPushStatus(
            @ToolParam(description = "要查询的股票代码，多个用逗号隔开，例如：000001,000002。不传则查询所有股票", required = false) String stockCodes,
            @ToolParam(description = "$_yumo_agent_user_phone_$") String phone) {

        try {
            log.info("查询预警推送状态 - 股票代码：{}，手机号：{}", stockCodes, phone);

            if (!StringUtils.hasText(phone)) {
                return "用户手机号不能为空";
            }
            // 调用服务层方法
            String result = alertConfigService.getAlertPushStatus(phone, stockCodes);

            log.info("预警推送状态查询成功");
            return result;

        } catch (Exception e) {
            log.error("查询预警推送状态失败", e);
            return "❌ 查询预警推送状态失败：" + e.getMessage();
        }
    }
}
